export default class JSONUtil {
    /**
     * 复制json对象
     */
    static cp<T>(obj: T): T {
        try {
            return <T>JSON.parse(JSON.stringify(obj))
        } catch {
            return null
        }
    }

    /**
     * 深度拷贝-对象、数组、时间、正则
     * @param objT
     * @param hash
     * @returns
     */
    static deepClone<T>(objT: T, hash = new WeakMap()): T {
        let obj = <any>objT
        if (obj === null) return obj // 如果是 null 或者 undefined 就不进行拷贝操作
        if (obj instanceof Date) return <any>new Date(obj)
        if (obj instanceof RegExp) return <any>new RegExp(obj)
        // 可能是对象或者普通的值  如果是函数的话是不需要深拷贝
        if (typeof obj !== 'object') return obj
        // 是对象的话就要进行深拷贝
        if (hash.get(obj)) return hash.get(obj)
        try {
            let cloneObj = new obj.constructor()
            // 找到的是所属类原型上的 constructor,而原型上的 constructor 指向的是当前类本身
            hash.set(obj, cloneObj)
            for (let key in obj) {
                if (obj.hasOwnProperty(key)) {
                    // 实现一个递归拷贝
                    cloneObj[key] = this.deepClone(obj[key], hash)
                }
            }
            return cloneObj
        } catch (error) {
            return obj
        }
    }
}
